﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using Basicas.Utils;
using Basicas;
using System.Data;

namespace ProjetoJornada_DAL.Repositorio
{
    public class RepDesconto
    {
        private DAO dao;

        public RepDesconto()
        {
            this.dao = DAO.Instance;
        }

        private Desconto CarregarDesconto(MySqlDataReader dr)
        {
            Int32 id = dr.GetInt32("Id_Desconto");
            String motivo = dr.GetString("Motivo");
            Double valor = dr.GetDouble("Valor");
            Desconto desconto = new Desconto(id, motivo, valor);

            return desconto;
        }

        public Int32 InserirDesconto(Desconto desconto)
        {
            Int32 idDesconto = 0;
            String funcao = "sp_Desconto_Inserir";

            try
            {
                MySqlParameter[] parametros = new MySqlParameter[3];

                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"motivo";
                parametros[0].Value = desconto.Motivo;
                parametros[0].DbType = DbType.String;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"valor";
                parametros[1].Value = desconto.Valor;
                parametros[1].DbType = DbType.Double;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"Result";
                parametros[2].DbType = DbType.Int32;
                parametros[2].Direction = ParameterDirection.Output;

                idDesconto = (Int32)dao.ExecutaFuncao(parametros, funcao);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "inserirDesconto");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return idDesconto;
        }

        public Boolean RemoverDesconto(Int32 idDesconto)
        {
            String storeProcedure = "sp_Desconto_Delete";
            MySqlParameter[] paramentros = new MySqlParameter[1];
            Boolean retorno = false;

            try
            {
                paramentros[0] = new MySqlParameter();
                paramentros[0].ParameterName = @"codigoDesconto";
                paramentros[0].DbType = System.Data.DbType.Int32;
                paramentros[0].Value = idDesconto;

                retorno = dao.ExecutaSql(paramentros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "removerDescontoRepositorio");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return retorno;
        }

        public Boolean EditarDesconto(Desconto desconto)
        {
            String storeProcedure = "sp_Desconto_Edit";
            MySqlParameter[] parametros = new MySqlParameter[3];
            Boolean retorno = false;

            try
            {
                parametros[0] = new MySqlParameter();
                parametros[0].ParameterName = @"codigoDesconto";
                parametros[0].DbType = DbType.Int32;
                parametros[0].Value = desconto.Id;

                parametros[1] = new MySqlParameter();
                parametros[1].ParameterName = @"motivoIn";
                parametros[1].Value = desconto.Motivo;
                parametros[1].DbType = DbType.String;

                parametros[2] = new MySqlParameter();
                parametros[2].ParameterName = @"valorIn";
                parametros[2].Value = desconto.Valor;
                parametros[2].DbType = DbType.Double;

                retorno = dao.ExecutaSql(parametros, storeProcedure);
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "editarDescontoRepositorio");
                throw ex;
            }
            finally
            {
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return retorno;
        }

        public Desconto ConsultarDescontoPorId(Int32 id)
        {
            String storeProcedure = "sp_Desconto_Select_Id";
            MySqlDataReader dr = null;
            Desconto desconto = null;
            MySqlParameter[] paramtro = new MySqlParameter[1];

            try
            {
                paramtro[0] = new MySqlParameter();
                paramtro[0].ParameterName = @"Id";
                paramtro[0].DbType = System.Data.DbType.Int32;
                paramtro[0].Value = id;

                dr = dao.ExecutaLeituraProcedure(paramtro, storeProcedure);

                if (dr.Read())
                {
                    desconto = this.CarregarDesconto(dr);
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "consultarDescontoPorIdRepositorio");
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return desconto;
        }

        public List<Desconto> ConsultarTodsDescontos()
        {
            String storeProcedure = "sp_Desconto_Select_All";
            MySqlDataReader dr = null;
            List<Desconto> descontos = new List<Desconto>();

            try
            {
                dr = dao.ExecutaLeituraProcedure(storeProcedure);

                while (dr.Read())
                {
                    descontos.Add(this.CarregarDesconto(dr));
                }
            }
            catch (Exception ex)
            {
                Auxiliar.GravaLog(ex.Message, "consultarAlunoCpf");
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }

                if (dao != null)
                {
                    dao.FecharConexao();
                }
            }
            return descontos;
        }
    }
}